#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int arr[N];
int n;
int hh[10];//用来表示以谁为末尾的最长子序列
/*
    我们把问题变为从数组里面选出来n个数使他们构成首尾相连保证n最大这样我们删除的就少了

    1.状态表示dp[i]表示i位置结尾的子序列同时是接龙数列众多序列中最大的那个长度
    2.状态转移方程推导分为两大类一类是子序列长度为1此时dp[i]=1
    长度不为1说明前面有一个数我们定义下标为j取值范围为[0,i-1],(满足num[j]%10==num[i]/10)
    以为我们要dp[i]最大所以要求以j为结束的接龙数列长度也是最大的不就是我们的dp[j]+1?，此
    时我们要求dp[j]里面最大的值来跟新我们的dp[i]
    3.填表顺序从左往右
    4.返回值便利dp表选出最大的,返回n-max(dp[i])
*/
int help(int num)
{
    while(num>=10)
    {
        num/=10;
    }
    return num;
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
     int ans=0;
    vector<int>dp(n,1);//每个数都是一个接龙数列长度为1
    for(int i=0;i<n;i++)
    {
        // for(int j=0;j<=i-1;j++)
        // {
        //     //可以看到对于每个数不管他前面有过少个我们只关心
        //     //前面的数中末位和它首位相等数的dp值我们可以开一个数组记录
        //     if(arr[j]%10==help(arr[i]))
        //     {
        //         dp[i]=max(dp[j]+1,dp[i]);
        //     }
        // }
        dp[i]=max(dp[i],hh[help(arr[i])]+1);
        // 34  ......  437
        hh[arr[i]%10]=max(hh[arr[i]%10],dp[i]);
        ans=max(ans,dp[i]);
    }
   
   
    cout<<n-ans<<endl;
    return 0;
}